package com.feicheng.lanniao.service.impl;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.feicheng.lanniao.entity.Permission;
import com.feicheng.lanniao.entity.RolePermission;
import com.feicheng.lanniao.entity.User;
import com.feicheng.lanniao.exception.SystemException;
import com.feicheng.lanniao.mapper.PermissionMapper;
import com.feicheng.lanniao.result.ResultInfo;
import com.feicheng.lanniao.service.IPermissionService;
import com.feicheng.lanniao.service.IRolePermissionService;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author cailongyang
 * @since 2021-07-13
 */
@Service
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements IPermissionService {

	@Autowired
	IRolePermissionService rolePermissionService;
	
	@Autowired
	HttpSession session;
	
	@Override
	public ResultInfo deletePermissionInfo(Integer permissionId) {

		QueryWrapper<RolePermission> rpWrapper = new QueryWrapper<RolePermission>();
		rpWrapper.eq("permission_id", permissionId);
		//删除此权限与所有角色的关联
		//この権限とすべてのロールとの関連付けを削除する
		rolePermissionService.remove(rpWrapper);
		this.removeById(permissionId);
		
		return ResultInfo.success();
	}
	

	@Override
	public ResultInfo addPermissionInfo(Permission permission) {

		//从会话对象得到current属性
		//セッションオブジェクトからcurrentプロパティを取得する
		JSONObject current = (JSONObject) session.getAttribute("CURRENT");
		//默认 "当前用户ID" 为0
		//現在のユーザーのデフォルトは0
		int currentUserId = 0;
		//若current属性非空, 则从current属性得到当前用户ID, 否则仍保持为0
		//currentプロパティがnullではないの場合、currentプロパティから現在のユーザーIDを取得する
		if (current != null) {
			User currentUser = (User) current.get("user");
			currentUserId = currentUser.getUserId();
		}

		//分别将"创建者”、“创建时间”、“最后修改者”、“更新时间”、“状态”赋值
		//「作成者」、「作成日時」、「最終更新者」、「更新日時」、「ステータス」をそれぞれ割り当てる
		permission.setCu(currentUserId);
		permission.setCt(LocalDateTime.now());
		permission.setUu(currentUserId);
		permission.setUt(LocalDateTime.now());
		permission.setStatu(true);
		
		this.save(permission);

		return ResultInfo.success();
	}
	

	@Override
	public ResultInfo updatePermissionInfo(Permission permission) {
		
		permission.setCu(null);
		permission.setCt(null);
		//从会话对象得到current属性
		//セッションオブジェクトからcurrent属性を取得する
		JSONObject current = (JSONObject) session.getAttribute("CURRENT");
		int currentUserId = 0;
		if (current != null) {
			User currentUser = (User) current.get("user");
			currentUserId = currentUser.getUserId();
		}

		permission.setUu(currentUserId);
		permission.setUt(LocalDateTime.now());
		
		//必须有父级权限
		//親パーミッションが必要です
		if (null == permission.getpId()) {
			throw new SystemException("父级权限ID缺失");
		} 
		//如果父级权限是0，则权限路径赋值为空字符串
		//親パーミッションが0の場合、パーミッションパスは空の文字列に割り当てられる
		else if (permission.getpId() == 0) {
			permission.setPath("");
		} 
		//如果父级权限为非0数字，则若权限路径不可为空字符串或为空
		//親パーミッションがゼロ以外の数値の場合、パーミッションパスは空の文字列やNULLであってはならない
		else {
			if (!StringUtils.hasLength(permission.getPath())) {
				throw new SystemException("权限路径缺失");
			}
		}
		
		this.updateById(permission);
		
		return ResultInfo.success();
	}
	

	@Override
	public ResultInfo getPermissionInfo(Integer permissionId) {
		
		return ResultInfo.success(this.getById(permissionId));
	}
	
	@Override
	public ResultInfo getPermissionList(
			String name,
			String path,
			Boolean statu,
			Integer pId,
			Integer currentPage,
			Integer pageSize
			) {
		QueryWrapper<Permission> permissionQueryWapper = new QueryWrapper<Permission>();
		
		if (StringUtils.hasLength(name)) {
			permissionQueryWapper.like("name", name);
		}
		
		if (StringUtils.hasLength(path)) {
			permissionQueryWapper.like("path", path);
		}
		
		if (null != statu) {
			permissionQueryWapper.eq("statu", statu);
		}
		
		if (null != pId) {
			permissionQueryWapper.eq("p_id", pId);
		}
		
		IPage<Permission> pageInfo = new Page<Permission>(currentPage, pageSize);
		return ResultInfo.success(this.page(pageInfo, permissionQueryWapper));
	}
	


	
	@Override
	public ResultInfo allPermissions() {
		List<Permission> allList = this.list();
		//result是要最终被返回的List
		//resultは、最終的に返されるListです
		List<Permission> result = new ArrayList<Permission>();
		//pMap是临时Map，可以根据ID快速定位权限
		//pMapは一時的なMapです、IDに基づいて権限をすぐに迅速に検索
		Map<Integer, Permission> pMap = new HashMap<Integer, Permission>();
		
		for (Permission p : allList) {
			
			//如果权限的父级权限为0，则将之以 “其id : 权限” 的形式放入pMap与result中
			//親パーミッションが0の場合、このパーミッションを「id:permission」としてpMapとresultに入れる
			if (0 == p.getpId()) {
				pMap.put(p.getPermissionId(), p);
				result.add(p);
			}
		}
		
		//处理父级权限非0的情况
		//親パーミッションがゼロ以外の数値の場合
		for (Permission p : allList) {
			if (0 != p.getpId()) {
				//在pMap中获取其父权限对象fP
				//pMapから親パーミッションプロジェクトfpを取得する
				Permission fP = pMap.get(p.getpId());
				//如果fp的成员变量 “permissions” 为NULL，则赋为空数组
				//fpのインスタンス変数「permissions」がNULLの場合は、空の配列に割り当てられる
				if (fP.getSubPermissions() == null) {
					fP.setSubPermissions(new ArrayList<Permission>());
				}
				//将其放入父权限对象的成员变量 “permissions” 中
				//親パーミッションプロジェクトのインスタンス変数「permissions」に入れる
				fP.getSubPermissions().add(p);
			}
		}
		//释放pMap占用的空间
		//pMapが占有していたメモリースペースを解放する
		pMap = null;
		return ResultInfo.success(result);
	}
}
